'use strict';
/**
 * author：小小游 --- allen
 * date：2018.02.05
 * lastUpdateDate：2018.02.05
 * description：Generator函数与yield语句的使用
 */
 /**
  * 这是一个generator函数，内部它实现了Iterator接口
  * generator函数可以配合yield语句一起执行，如果没有yield语句，
  * 那么当调用next()方法的时候，就会执行完整个generator函数
  * 如果有了yield语句，它会把generator函数内部分成几段去执行，
  * 那么每一个断点是通过yield语句来暂停的
  * yield语句hereturn语句的区别就在于：yield语句可以返回多个值，
  * 而return语句每次只能返回一个值
  */
/**
 * yield语句与被赋值的情况
 * 有同学会问为啥第二次执行的next()函数，它的value值yield _name不是
 * 把值赋给了左边的变量name了吗，为啥它还是undefined呢？
 * 简单来说事情是这样的，首先要明确一件事情，yield语句本身是没有返回值的，
 * 明确的也可以说它每次给你返回一个undefined，所以就出现了下面的执行结果
 * 那么有没有办法让右侧的yield _name能传递给左边的变量name，然后return
 * 值呢，那么这个事就要交给next()传递参数即可，如下所示：
 */
function * fn (_name) {
    let name = yield _name;
    return name;
}

let iterator = fn ('xiaoxiaoyou');
// result：{ value: 'xiaoxiaoyou', done: false }
console.log(iterator.next());
// result：{ value: '我就是小小游，英文名是allen!', done: true }
console.log(iterator.next('我就是小小游，英文名是allen!'));
